from django_redis import get_redis_connection
from rest_framework import serializers
from redis.exceptions import RedisError
# 导入日志模块
import logging
logger = logging.getLogger('meiduo')


# 因为序列化器没有关联的模型，因此不使用ModelSerializer
class RegisterSMSCodeSerializer(serializers.Serializer):
    text = serializers.CharField(label='验证码', max_length=4, min_length=4, required=True)
    image_code_id = serializers.UUIDField(label='uuid')


    # 字段的类型 UUIDField
    # 字段的选项 max_length=4
    # 单个字段校验
    # 多个字段校验
    def validate(self, attrs):
        # 我们需要把redis中的验证码获取出来之后进行校验
        # 1.拿到用户提交的验证码
        text = attrs.get('text')
        image_code_id = attrs.get('image_code_id')

        # 2.获取redis中的验证码
        # 2.1 连接redis
        redis_conn = get_redis_connection('code')

        # 2.2 获取验证码
        redis_text = redis_conn.get('img_%s' % image_code_id)

        # 2.3 判断redis_text是否过期
        if redis_text is None:
            raise serializers.ValidationError('验证码过期')

        # 2.4 主动删除原来的redis数据
        try:
            redis_conn.delete('img_%s' % image_code_id)
        except RedisError as e:
            logger.error(e)

        # 2.5 进行比较
        # redis获取的数据类型是bytes类型，而且需要忽略大小写
        if redis_text.decode().lower() != text.lower():
            raise serializers.ValidationError('验证码不正确')

        return attrs